www.gusucode.com > VC++ SkinCtrls窗体常用控件换肤程序-源码程序 > VC++ SkinCtrls窗体常用控件换肤程序-源码程序/code/Shared/WinClasses.cpp

    //Download by http://www.NewXing.com
// WinClasses.cpp: implementation of the CWinClasses class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "WinClasses.h"
#include "wclassdefines.h"

#include <afxpriv.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

// helper function for everyone to use
void TRACEWND(LPCTSTR szFunctionName, HWND hWnd)
{
#ifdef _DEBUG
	if (hWnd)
	{
		CString sText; 
		//		pWnd->GetWindowText(sText); 
		TRACE ("%s(%s, %s, id = %d)\n", szFunctionName, CWinClasses::GetClass(hWnd), sText, GetDlgCtrlID(hWnd)); 
	}
#endif
}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CMap<LPCTSTR, LPCTSTR, int, int&> CWinClasses::s_mapCtrlClasses;

CString CWinClasses::GetClass(HWND hWnd)
{
	static char szWndClass[128] = "";
	
	if (hWnd)
		::GetClassName(hWnd, szWndClass, 127);
	
	return CString(szWndClass);
}

BOOL CWinClasses::IsClass(HWND hWnd, LPCTSTR szClass)
{
	if (hWnd)
	{
		char szWndClass[128] = "";

		::GetClassName(hWnd, szWndClass, 127);
		return (lstrcmpi(szClass, szWndClass) == 0);
	}

	return FALSE;
}

CString CWinClasses::GetClassEx(HWND hWnd)
{
	CString sClass = GetClass(hWnd);
	
	if (sClass.Find("Afx") == 0) // its an mfc framework base or derived class
	{
		// can do the check if pWnd is permanent else mfc will not yet
		// have hooked up
		CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);

		if (pWnd)
		{
			// must do the check in order of most derived class first
			if (pWnd->IsKindOf(RUNTIME_CLASS(CView)))
				return WC_MFCVIEW;
			
			else if (pWnd->IsKindOf(RUNTIME_CLASS(CMDIFrameWnd)))
				return WC_MFCMDIFRAME;
			
			else if (pWnd->IsKindOf(RUNTIME_CLASS(CMDIChildWnd)))
				return WC_MFCMDICHILD;
			
			else if (pWnd->IsKindOf(RUNTIME_CLASS(CMiniDockFrameWnd)))
				return WC_MFCMINIDOCKFRAME;
			
			else if (pWnd->IsKindOf(RUNTIME_CLASS(CMiniFrameWnd)))
				return WC_MFCMINIFRAME;
			
			else if (pWnd->IsKindOf(RUNTIME_CLASS(CFrameWnd))) // this is the catch all for frame wnds
				return WC_MFCFRAME;
			
			else if (pWnd->IsKindOf(RUNTIME_CLASS(CSplitterWnd)))
				return WC_MFCSPLITTER;
			
			else if (pWnd->IsKindOf(RUNTIME_CLASS(CDialogBar)))
				return WC_MFCDIALOGBAR;
			
			else if (pWnd->IsKindOf(RUNTIME_CLASS(CControlBar)))
				return WC_CONTROLBAR;
			
			else 
				return WC_MFCWND; // catch all for all window classes
		}
	}
	
	return sClass;
}

BOOL CWinClasses::IsControlClass(HWND hWnd)
{
	return IsControlClass(GetClass(hWnd));
}

BOOL CWinClasses::IsControlClass(LPCTSTR szClass)
{
	// init
	if (!s_mapCtrlClasses.GetCount())
	{
		s_mapCtrlClasses[WC_BUTTON] = 1;
		s_mapCtrlClasses[WC_STATIC] = 1;
		s_mapCtrlClasses[WC_EDIT] = 1;  
		s_mapCtrlClasses[WC_COMBOBOX] = 1;
		s_mapCtrlClasses[WC_COMBOLBOX] = 1;
		s_mapCtrlClasses[WC_LISTBOX] = 1;  
		s_mapCtrlClasses[WC_SCROLLBAR] = 1;
		s_mapCtrlClasses[WC_TOOLBAR] = 1;  
		s_mapCtrlClasses[WC_SPIN] = 1;     
		s_mapCtrlClasses[WC_PROGRESS] = 1; 
		s_mapCtrlClasses[WC_SLIDER] = 1;   
		s_mapCtrlClasses[WC_HOTKEY] = 1;   
		s_mapCtrlClasses[WC_SHELLDLLDEFVIEW] = 1;  
		s_mapCtrlClasses[WC_STATUSBAR] = 1;        
		s_mapCtrlClasses[WC_ANIMATE] = 1;          
		s_mapCtrlClasses[WC_RICHEDIT] = 1;         
		s_mapCtrlClasses[WC_RICHEDIT20] = 1;       
		s_mapCtrlClasses[WC_DATETIMEPICK] = 1;     
		s_mapCtrlClasses[WC_MONTHCAL] = 1;         
		s_mapCtrlClasses[WC_REBAR] = 1;            
		s_mapCtrlClasses[WC_TOOLTIPS] = 1; 
		s_mapCtrlClasses[WC_THUMBNAILVIEW] = 1; 
		s_mapCtrlClasses[WC_IE] = 1; 
		s_mapCtrlClasses[WC_SHDOCOBJVW] = 1; 
		s_mapCtrlClasses[WC_SHELLEMBEDDING] = 1; 
	}

	int nTemp;

	return s_mapCtrlClasses.Lookup(szClass, nTemp);
}